package com.swak.entity;

import java.io.Serializable;

import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

/**
 * 事件,配合可靠消息来构建需要发送的消息
 * 
 * @author 618lf
 */
public interface Event<PK> {

	/**
	 * 事件的主键
	 * 
	 * @return
	 */
	default PK getId() {
		return null;
	}

	/**
	 * 构建可靠消息 -- 携带的事件对象
	 * 
	 * @return
	 */
	default Object build(Byte type) {
		PK id = this.getId();
		if (id != null) {
			return EventDTO.of().setId(id).setType(type);
		}
		return null;
	}

	/**
	 * 最简单的事件
	 * 
	 * @author 618lf
	 * @param <PK>
	 */
	@Getter
	@Setter
	@Accessors(chain = true)
	@SuppressWarnings("unchecked")
	public static class EventDTO implements Serializable {

		private static final long serialVersionUID = 1L;

		/**
		 * 事件的ID
		 */
		private Object id;

		/**
		 * 事件的类型
		 */
		private Byte type;

		/**
		 * 事件的主体
		 */
		private Object data;

		public <T> T getId() {
			return (T) id;
		}

		public <T> T getData() {
			return (T) data;
		}

		public <T> T as() {
			return (T) this;
		}

		public static EventDTO of() {
			return new EventDTO();
		}
	}
}